package com.validations;

import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import javax.inject.Named;

import org.primefaces.component.selectonemenu.SelectOneMenu;

import com.beans.DisplayHelperBean;
import com.model.Activity;

@Named
public class TaskDateValidator implements Validator {
	public void validate(FacesContext context, UIComponent component,
			Object value) throws ValidatorException {
		Date finishDate = (Date) value;
		UIInput startDateUI = (UIInput) component.getAttributes().get(
				"startDate");
		SelectOneMenu selectOneMenu = (SelectOneMenu) component.getAttributes()
				.get("selectOneMenuActivities");

		String activityString = (String) selectOneMenu.getSubmittedValue();
		@SuppressWarnings("unchecked")
		List<Activity> activityList = (List<Activity>) component
				.getAttributes().get("activityList");
		Activity activity = DisplayHelperBean.findSelectedActivity(
				activityString, activityList);

		Date startDate = (Date) startDateUI.getValue();
		if (startDate != null) {
			if (startDate != null && finishDate != null
					&& finishDate.before(startDate)) {
				throw new ValidatorException(new FacesMessage(
						FacesMessage.SEVERITY_ERROR, "",
						"La fecha de finalizacion no puede ser anterior "
								+ "a su fecha inicial"));
			}
			if (startDate.before(activity.getStartDate())) {
				throw new ValidatorException(new FacesMessage(
						FacesMessage.SEVERITY_ERROR, "",
						"La fecha de comienzo de la tarea no puede ser anterior "
								+ "a la fecha de comienzo de la actividad"));
			}
			if (finishDate.after(activity.getFinishDate())) {
				throw new ValidatorException(new FacesMessage(
						FacesMessage.SEVERITY_ERROR, "",
						"La fecha de finalizacion de la tarea no puede ser posterior "
								+ "a la fecha final de la actividad"));
			}

		}
	}

}